package com.dl.test.util.file;

/**
 * SFTP工具类
 *
 * @author Lenovo
 * @creeate 2019/12/24 15:00
 */

import com.jcraft.jsch.*;
import com.jcraft.jsch.ChannelSftp.LsEntry;

import java.io.*;
import java.util.Properties;
import java.util.Vector;

/**
 * Created by chenxl on 2018/3/8.
 */
public class SFTPUtils {

    private ChannelSftp sftp;
    // SFTP地址
    private String sftp_host = "192.168.142.101";
    // 端口
    private int sftp_port = 22;
    // 用户名
    private String sftp_username = "root";
    // 密码
    private String sftp_password = "123626";
    // 文件路径
    private String sftp_directory = "";

    // 无参构造函数
    public SFTPUtils() {
        InputStream in = null;
        try {
            //获取连接
            sftp = connect(sftp_host, sftp_port, sftp_username, sftp_password);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public SFTPUtils(String host, int port, String username, String password) {
        sftp_host = host;
        sftp_port = port;
        sftp_username = username;
        sftp_password = password;
        //获取连接
        sftp = connect(host, port, username, password);
    }

    /**
     * 连接sftp服务器
     *
     * @param host     主机
     * @param port     端口
     * @param username 用户名
     * @param password 密码
     * @return
     */
    public ChannelSftp connect(String host, int port, String username, String password) {
        ChannelSftp sftp = null;
        try {
            JSch jsch = new JSch();
            jsch.getSession(username, host, port);
            Session sshSession = jsch.getSession(username, host, port);
            sshSession.setPassword(password);
            Properties sshConfig = new Properties();
            sshConfig.put("StrictHostKeyChecking", "no");
            sshSession.setConfig(sshConfig);
            sshSession.connect();
            Channel channel = sshSession.openChannel("sftp");
            channel.connect();
            sftp = (ChannelSftp) channel;
        } catch (Exception e) {
            System.out.println("e = " + e);
        }
        return sftp;
    }

    /**
     * 递归根据路径创建文件夹
     *
     * @param dirs     根据 / 分隔后的数组文件夹名称
     * @param tempPath 拼接路径
     * @param length   文件夹的格式
     * @param index    数组下标
     * @return
     */
    public boolean mkdirDir(String[] dirs, String tempPath, int length, int index) {
        // 以"/a/b/c/d"为例按"/"分隔后,第0位是"";顾下标从1开始
        index++;
        if (index < length) {
            // 目录不存在，则创建文件夹
            tempPath += "/" + dirs[index];
        }
        try {
//            LogTool.logError("检测目录[" + tempPath + "]");
            sftp.cd(tempPath);
            if (index < length) {
                // 如果当前级次小于目录数组长度,说明目录还未遍历到底
                mkdirDir(dirs, tempPath, length, index);
            }
        } catch (SftpException ex) {
//            LogTool.logError("创建目录[" + tempPath + "]");
            try {
                sftp.mkdir(tempPath);
                sftp.cd(tempPath);
            } catch (SftpException e) {
                e.printStackTrace();
                System.out.println("创建目录[" + tempPath + "]失败,异常信息[" + e.getMessage() + "]");
                return false;
            }
//            LogTool.logError("进入目录[" + tempPath + "]");
            mkdirDir(dirs, tempPath, length, index);
        }
        return true;
    }
    /**
    * 上传文件
    * @param uploadFile 文件
    * @author rk
    * @date 2021/11/24 16:01
    */
    public String upload(String uploadFile){
        return upload(sftp_directory,uploadFile);
    }

    /**
     * 上传文件
     *
     * @param directory  上传的目录
     * @param uploadFile 要上传的文件
     */
    public String upload(String directory, String uploadFile) {
        // 完整路径
        directory = sftp_directory + directory;
        try {
            // 查找当前目录
            sftp.cd(directory);
        } catch (Exception e) {
            // 目录不存在，则创建文件夹
            String[] dirs = directory.split("/");
            String tempPath = "";
            // 当前目录级次
            int index = 0;
            // 创建目录
            mkdirDir(dirs, tempPath, dirs.length, index);
            // 验证目录创建是否完成
            try {
                sftp.cd(directory);
            } catch (SftpException sftpException) {
                return "error";
            }
        }
        // 如果目录存在,则直接上传该文件,
        File file = new File(uploadFile);
        FileInputStream fileInputStream = null;
        try {
            fileInputStream = new FileInputStream(file);
            sftp.put(fileInputStream, file.getName());
            fileInputStream.close();
            disconnect();
        } catch (Exception f) {
            return "error";
        }
        return directory;
    }

    /**
     * 下载文件
     *
     * @param directory    下载目录
     * @param downloadFile 下载的文件
     * @param saveFile     存在本地的路径
     */
    public File download(String directory, String downloadFile, String saveFile) {
        try {
            sftp.cd(directory);
            File file = new File(saveFile);
            FileOutputStream fileOutputStream = new FileOutputStream(file);
            sftp.get(downloadFile, fileOutputStream);
            fileOutputStream.close();
            disconnect();
            return file;
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 下载文件
     *
     * @param downloadFilePath 下载的文件完整目录
     * @param saveFile         存在本地的路径
     */
    public File download(String downloadFilePath, String saveFile) {
        try {
            int i = downloadFilePath.lastIndexOf('/');
            if (i == -1){
                return null;
            }
            sftp.cd(downloadFilePath.substring(0, i));
            File file = new File(saveFile);
            FileOutputStream fileOutputStream = new FileOutputStream(file);
            sftp.get(downloadFilePath.substring(i + 1), fileOutputStream);
            fileOutputStream.close();
            disconnect();
            return file;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 删除文件
     *
     * @param directory  要删除文件所在目录
     * @param deleteFile 要删除的文件
     */
    public void delete(String directory, String deleteFile) {
        try {
            sftp.cd(directory);
            sftp.rm(deleteFile);
        } catch (Exception e) {
        }
    }

    /**
     * 判断sftp是否连接
     *
     * @return
     */
    public boolean isConnected() {
        if (sftp != null) {
            return sftp.isConnected();
        }
        return false;
    }

    /**
     * 解除连接
     */
    public void disconnect() {
        if (sftp == null) {
            return;
        }
        try {
            sftp.getSession().disconnect();
        } catch (JSchException e) {
        }
        sftp.quit();
        sftp.disconnect();
    }

    /**
     * 查找文件
     * @param fileName  文件名
     * @author rk
     * @date 2021/11/29 10:11
     */
    public boolean findFile(String fileName){
        boolean success = false;
        SFTPUtils sf = new SFTPUtils();
        //查看文件列表
        Vector<LsEntry> files = null;
        try {
            files = sf.listFiles(sftp_directory);
        } catch (SftpException e) {
            e.printStackTrace();
        }
        for (LsEntry file : files) {
            if (fileName.equals(file.getFilename())){
                success = true;
            }
        }
        return success;
    }

    /**
     * 列出目录下的文件
     *
     * @param directory 要列出的目录
     * @throws SftpException
     */
    public Vector<LsEntry> listFiles(String directory) throws SftpException {
        /*if (!isConnected()) {
        }*/
        return sftp.ls(directory);
    }

    public void main() throws IOException {
//        SFTPUtils sf = new SFTPUtils("10.20.21.48", 22, "mof", "mof!gov!cn");
//        SFTPUtils sf = new SFTPUtils("204.44.70.38", 22, "root", "Yuanyi1234");
        SFTPUtils sf = new SFTPUtils("192.168.111.132",22,"mysftp2","mysftp2");
//        String directory = "/data/sftp/mysftp/upload/2222/3333";
        String directory = "/22442/4444";
        String deleteFile = "";
        String filePath = "/data/sftp/mysftp/upload/wu_1fldmt2na22s1f2o1h9tjgs4k3j.xlsx";

        sf.upload(directory, "D:\\wu_1fldqksk7itc6sp3at1nnk1mtf5.jpg");    //上传文件
//        sftp.mkdir();

//        try {
//            sftp.cd("upload");
//            sftp.mkdir("22");
//        } catch (SftpException e) {
//            e.printStackTrace();
//        }



//        sf.download(directory, "wu_1fldqksk7itc6sp3at1nnk1mtf5.jpg", "D:\\32132.jpg");
//        sf.download(directory, "wu_1fldqksk7itc6sp3at1nnk1mtf5.jpg", "D:\\32132.jpg");
//            File download = sf.download("/home/cods_jrjg_20191204_013012.zip", "E:\\czb\\test\\cods_jrjg_20191204_013012.zip");

//        sf.delete(directory, "123.txt"); //删除文件

//        System.out.println(sf.findFile("wu_1fldqksk7itc6sp3at1nnk1mtf5.jpg"));


//        Vector<LsEntry> files = null;        //查看文件列表
//        try {
//            files = sf.listFiles(directory);
//        } catch (SftpException e) {
//            e.printStackTrace();
//        }
//        for (LsEntry file : files) {
//            System.out.println("###\t" + file.getFilename());
//        }
        sf.disconnect();
    }
}
